home *** CD-ROM | disk | FTP | other *** search
/ The Arsenal Files 8 / The Arsenal Files Collection #8 (Arsenal Computer) (1996).ISO / g_quake / server~1.zip / _BURN.QC next >
Text File  |  1996-10-04  |  9KB  |  286 lines

  1. /*
  2. **
  3. ** _burn.qc (Burn Code, 1.0)
  4. **
  5. ** Copyright (C) 1996 Johannes Plass
  6. ** 
  7. ** This program is free software; you can redistribute it and/or modify
  8. ** it under the terms of the GNU General Public License as published by
  9. ** the Free Software Foundation; either version 2 of the License, or
  10. ** (at your option) any later version.
  11. ** 
  12. ** This program is distributed in the hope that it will be useful,
  13. ** but WITHOUT ANY WARRANTY; without even the implied warranty of
  14. ** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  15. ** GNU General Public License for more details.
  16. **
  17. ** You should have received a copy of the GNU General Public License
  18. ** along with this program; if not, write to the Free Software
  19. ** Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
  20. ** 
  21. ** Author:   Johannes Plass (plass@dipmza.physik.uni-mainz.de)
  22. **
  23. */
  24.  
  25. void(entity player) BurnInfo =
  26. {
  27.   if (!USE_MODULE_BURN) return;
  28. };
  29.  
  30. void(entity player) BurnInit =
  31. {
  32.   if (!USE_MODULE_BURN) return;
  33. };
  34.  
  35. void(entity player) BurnActiveMessage =
  36. {
  37.   if (!USE_MODULE_BURN) return;
  38.               // 123456789#123456789#123456789#12345678
  39.   sprint(player,"  Burn\n");
  40. };
  41.  
  42. //==================================================================
  43. //   BurnMakeBubble
  44. //==================================================================
  45.  
  46. void() BurnMakeBubble =
  47. {
  48.   local entity    bubble;
  49.  
  50.   //dprint("BurnMakeBubble\n");
  51.   
  52.   bubble              = spawn();
  53.   bubble.movetype     = MOVETYPE_NOCLIP;
  54.   bubble.solid        = SOLID_NOT;
  55.   bubble.velocity     = '0 0 15';
  56.   bubble.nextthink    = time + 0.5;
  57.   bubble.think        = bubble_bob;
  58.   bubble.classname    = "bubble";
  59.   bubble.owner        = self.owner;
  60.   bubble.frame        = 0;
  61.   bubble.cnt          = 0;
  62.   setmodel (bubble, "progs/s_bubble.spr");
  63.   setorigin (bubble, self.owner.origin + '0 0 24');
  64.   setsize (bubble, '-8 -8 -8', '8 8 8');
  65.   
  66.   self.nextthink      = time + 0.1 + random()*0.2;
  67.   self.think          = BurnMakeBubble;
  68.   self.air_finished   = self.air_finished + 1;
  69.   if (self.air_finished >= self.bubble_count) remove(self);
  70. };
  71.  
  72.  
  73. //==================================================================
  74. //   BurnSteam
  75. //==================================================================
  76.  
  77. void(float num_bubbles) BurnSteam =
  78. {
  79.   local entity steam;
  80.   
  81.   //dprint("BurnSteam\n");
  82.   
  83.   steam              = spawn();
  84.   steam.movetype     = MOVETYPE_NONE;
  85.   steam.solid        = SOLID_NOT;
  86.   steam.nextthink    = time + 0.1;
  87.   steam.think        = BurnMakeBubble;
  88.   steam.air_finished = 0;
  89.   steam.owner        = self.enemy;
  90.   steam.bubble_count = num_bubbles;
  91.   setorigin (steam, self.enemy.origin);
  92.   sound (steam.owner, CHAN_BODY, burn_extinguish_sound, 1, ATTN_NORM);
  93. };
  94.  
  95. //==================================================================
  96. //   BurnThink
  97. //==================================================================
  98.  
  99. void() BurnThink =
  100. {
  101.   local float damage,r;
  102.   local entity    e;
  103.  
  104.   //dprint("BurnThink\n");
  105.  
  106.   if (self.enemy.deadflag != DEAD_NO) {
  107.     if (self.enemy.burn_burning) {
  108.       if (self.enemy.modules_killweapon != MODULES_WEAPON_BURN) {
  109.     self.enemy.burn_burning = 0;
  110.       } else {
  111.     if (self.enemy.deadflag == DEAD_DEAD) {
  112.       remove(self.burn_flame);
  113.       setorigin(self,self.origin-'0 0 12');
  114.       BecomeExplosion();
  115.       return;
  116.     }
  117.       }
  118.     }
  119.   }
  120.  
  121.   if (time > self.burn_damage_time) {
  122.     if (self.enemy.waterlevel > 1) {
  123.       BurnSteam(8);
  124.       self.enemy.burn_burning = 0;
  125.     }
  126.     if (self.enemy.burn_burning) {
  127.       damage = 0;
  128.       if (self.enemy.burn_burning & 1) {
  129.     damage = damage + 3;
  130.     if (time > self.burn_lifetime1) self.enemy.burn_burning = self.enemy.burn_burning - 1;
  131.       }
  132.       if (self.enemy.burn_burning & 2) {
  133.     damage = damage + 3;
  134.     if (time > self.burn_lifetime2) self.enemy.burn_burning = self.enemy.burn_burning - 2;
  135.       }
  136.       if (self.enemy.burn_burning & 4) {
  137.     damage = damage + 3;
  138.     if (time > self.burn_lifetime4) self.enemy.burn_burning = self.enemy.burn_burning - 4;
  139.       }
  140.       r = random();
  141.       if (damage > 0 && self.enemy.health > 0) 
  142.       T_Damage (self.enemy, self, self.owner, damage);
  143.       e = findradius(self.enemy.origin+'0 0 18', 50);
  144.       while (e) {
  145.     if (e != self.enemy) {
  146.       if (e.takedamage == DAMAGE_AIM) {
  147.         T_Damage (e, self, self.enemy, 6+r*4);
  148.         if (r > 0.5) { BurnSetOnFire(e,self.enemy); }
  149.       }
  150.     }
  151.     e = e.chain;
  152.       }
  153.     }
  154.     self.burn_damage_time = time + 1;
  155.   }
  156.  
  157.   if (self.enemy.burn_burning) {
  158.      local vector vf,vr;
  159.      makevectors(self.enemy.v_angle);
  160.      vf = (crandom()*2) * v_forward;
  161.      vr = (crandom()*4) * v_right;
  162.      self.origin = self.enemy.origin + '0 0 18' - 7*v_forward + vf + vr; 
  163.      self.burn_flame.origin = self.enemy.origin + '0 0 18' - 7*v_forward - vf - vr; 
  164.      if (self.enemy.deadflag != DEAD_NO) {
  165.        self.origin = self.origin - '0 0 12';
  166.        self.burn_flame.origin = self.burn_flame.origin - '0 0 12';
  167.      }
  168.      setorigin(self,self.origin);
  169.      setorigin(self.burn_flame,self.burn_flame.origin);
  170.      self.nextthink = time + 0.02;
  171.      return;
  172.   }
  173.   remove(self.burn_flame);
  174.   remove(self);
  175. };
  176.  
  177. //==================================================================
  178. //   BurnSetOnFire
  179. //==================================================================
  180.  
  181. void () barrel_explode; // defined in misc.qc
  182.  
  183. void(entity victim, entity attacker) BurnSetOnFire =
  184. {
  185.   local entity flame;
  186.   local float r;
  187.   
  188.   if (!USE_MODULE_BURN) return;
  189.  
  190.   //dprint("BurnSetOnFire\n");
  191.   
  192.   if (victim.waterlevel > 1) return;
  193.   if (victim.invincible_finished >= time) return;
  194.   if (victim.protect_finished >= time) return; //#jp#(Protect)
  195.   if (victim.classname == "drone") return; //#jp#(Drone)
  196.   if (victim.th_die == barrel_explode) return; // exclude barrels
  197.   if (victim.health <= 0) return;
  198.  
  199.   if (!victim.burn_burning) {
  200.     flame                 = spawn ();
  201.     flame.owner           = attacker;
  202.     flame.enemy           = victim;
  203.     flame.movetype        = MOVETYPE_NONE;
  204.     flame.velocity        = '0 0 0';
  205.     flame.solid           = SOLID_NOT;
  206.     flame.ltime           = time + 10;
  207.     flame.classname       = "burn_flame";
  208.     flame.origin          = victim.origin + '-4 0 18';
  209.     flame.think           = BurnThink;
  210.     flame.nextthink       = time+0.1;
  211.     flame.modules_weapon  = MODULES_WEAPON_BURN;
  212.     flame.effects         = flame.effects | EF_DIMLIGHT;
  213.     setmodel (flame, "progs/flame2.mdl");
  214.     flame.frame           = 1;
  215.     setsize (flame, '0 0 0', '0 0 0');            
  216.     setorigin (flame, victim.origin+'-4 0 18');
  217.     victim.burn_flame = flame;
  218.  
  219.     local entity flame2;
  220.     flame2                 = spawn ();
  221.     flame2.owner           = attacker;
  222.     flame2.enemy           = victim;
  223.     flame2.movetype        = MOVETYPE_NONE;
  224.     flame2.velocity        = '0 0 0';
  225.     flame2.solid           = SOLID_NOT;
  226.     flame2.ltime           = time + 15;
  227.     flame2.origin          = victim.origin + '4 0 18';
  228.     flame2.think           = SUB_Null;
  229.     setmodel (flame2, "progs/flame2.mdl");
  230.     flame2.frame           = 1;
  231.     setsize (flame2, '0 0 0', '0 0 0');            
  232.     setorigin (flame2, victim.origin+'4 0 18');
  233.     victim.burn_flame2 = flame2;
  234.     flame.burn_flame = flame2;
  235.   }
  236.   else flame = victim.burn_flame;
  237.   
  238.   if (victim.burn_burning == 7) {
  239.     if (flame.burn_lifetime1 <= flame.burn_lifetime2) {
  240.       if (flame.burn_lifetime1 <= flame.burn_lifetime4) {
  241.     flame.burn_lifetime1 = time + 15;
  242.       }
  243.     }
  244.     else if (flame.burn_lifetime2 <= flame.burn_lifetime4) {
  245.       if (flame.burn_lifetime2 <= flame.burn_lifetime1) {
  246.     flame.burn_lifetime2 = time + 15;
  247.       }
  248.     }
  249.     else flame.burn_lifetime4 = time + 15;
  250.   }
  251.   else if (!(victim.burn_burning & 1)) {
  252.     flame.burn_lifetime1 = time + 15;
  253.     victim.burn_burning = victim.burn_burning | 1;
  254.   }
  255.   else if (!(victim.burn_burning & 2)) {
  256.     flame.burn_lifetime2 = time + 15;
  257.     victim.burn_burning = victim.burn_burning | 2;
  258.   }
  259.   else {
  260.     flame.burn_lifetime4 = time + 15;
  261.     victim.burn_burning = victim.burn_burning | 4;
  262.   }
  263.   sound (flame, CHAN_WEAPON, burn_light_sound, 1, ATTN_NORM);
  264. };
  265.  
  266. //==================================================================
  267. //   BurnPainSound
  268. //==================================================================
  269.  
  270. void() BurnPainSound =
  271. {
  272.   if (time < self.burn_painsound_time) return;
  273.   if (random() > 0.5) sound (self, CHAN_VOICE, burn_pain_sound_1, 1, ATTN_NORM);
  274.   else                sound (self, CHAN_VOICE, burn_pain_sound_2, 1, ATTN_NORM);
  275.   self.burn_painsound_time = time+0.8;
  276. };
  277.  
  278.  
  279.  
  280.  
  281.  
  282.  
  283.  
  284.  
  285.  
  286.